home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / C9.TXT < prev    next >
Text File  |  1996-07-05  |  16KB  |  412 lines

  1. C Dili - 9. Konu
  2.  
  3. Standart Input/Output
  4.  
  5. BASITIO.C:
  6. ================================================================
  7. #include <stdio.h>    /* input/output icin standard header */
  8.  
  9. main()
  10. {
  11. char c;
  12.  
  13.    printf("Herhangi bir tusa basin.  X = Programi durdurur. \n");
  14.  
  15.    do {
  16.       c = getchar();    /* klavyeden bir tus okuyalim         */
  17.       putchar(c);       /* ekranda gosterelim.                */
  18.    } while (c != 'X');  /* ta ki okunan bir X oluncaya dek... */
  19.  
  20.    printf("\nProgramin sonu.\n");
  21. }
  22. ================================================================
  23.  
  24. Standart I/O deyimi, verinin girildigi ve ciktigi en normal yerleri,
  25. klavyeyi ve ekrani kast eder.  Bu kutuge ilk baktiginizda, "#include
  26. <stdio.h>" komutunu goreceksiniz. Bu komut on-derleyiciye, kucuktur ve
  27. buyuktur isaretleri arasinda yer alan kutuk isminin programa eklenmesini
  28. soyler. Bazen, < > isaretleri yerine den-den " " isaretleri de
  29. gorebilirsiniz. Aralarindaki fark, <> isaretlerinin on-derleyiciye, su
  30. anda calistiginiz diskte / dizinde degil de, bu tip kutuklerin konuldugu
  31. yerde aramasini bildirir. Halbuki den-den isaretleri ile belirlenmis bir
  32. kutuk ismi, sizin su anda bulundugunuz disk / dizinde aranir. Genellikle,
  33. "bu tip kutuklerin konuldugu yer", derleyiciye daha onceden belirtilir.
  34. Ornegin, Quick C derleyicisinde, derleyiciye girmeden once:
  35.                SET INCLUDE=C:\INCLUDE
  36. yazmak, derleyicinin bundan sonra butun 'include' edilecek, yani eklenecek
  37. kutuklerin C: diskinin \INCLUDE dizininde aranmasini belirtir.
  38.  
  39. Sonu .h ile biten kutuklerin, ozel bir fonksiyonu vardir. Bunlara header
  40. yada baslik kutukleri denir. Genellikle iclerinde, bazi fonksiyonlari
  41. kullanmak icin gereken tanimlamalar yer alir. Bu kullandigimiz "stdio.h"
  42. kutugu ise, bir suru "#define" komutundan olusur.
  43.  
  44. C DE INPUT/OUTPUT ISLEMLERI
  45.  
  46. C dilinde lisanin bir parcasi olarak tanimlanmis input/output komutlari
  47. yoktur, bu nedenle bu fonksiyonlarin kullanici tarafindan yazilmasi
  48. gereklidir. Her C kullanan kisi, kendi input/output komutlarini yazmak
  49. istemediginden, derleyici yazarlari bu konuda calisma yapmislar, ve bize
  50. bir suru input/output fonksiyonlari saglamislardir. Bu fonksiyonlar
  51. standart hale gelmislerdir, ve hemen her C derleyicisinde ayni
  52. input/output komutlarini bulabilirsiniz. C nin lisan tanimi, Kernigan ve
  53. Richie tarafindan yazilmis bir kitaptir, ve onlar bu gorecegimiz
  54. input/output fonksiyonlari bu kitaba katmislardir. 
  55.  
  56. Bu "stdio.h" isimli kutugu incelemenizde fayda vardir. Icinde bircok
  57. anlamadiginiz nokta olacaktir, fakat bazi kisimlar tanidik olacaktir. 
  58.  
  59. DIGER INCLUDE KUTUKLERI
  60.  
  61. C de buyuk programlar yazmaya basladiginizda, programlari ufak parcalara
  62. ayirip ayri ayri derlemek isteyebilirsiniz. Bu degisik parcalarin ortak
  63. kisimlarini tek bir kutukte toplayip, bir degisiklik gerektiginde sadece o
  64. ortak kutukten yapmayi isteyebilirsiniz (ornegin global degisken
  65. tanimlari.) Bu gibi durumlarda "#include" kutukleri cok faydali olacaktir.
  66.  
  67. "BASITIO" YA GERI DONELIM
  68.  
  69. "c" isimli degisken tanimlanir, ve ekrana mesaj yazilir. Daha sonra,
  70. kendimizi "c", buyuk harf X e esit olmadigi surece devam eden bir dongunun
  71. icinde buluyoruz. Bu programdaki iki yeni fonksiyon, su an icin ilgi
  72. noktamiz. Bunlar klavyeden bir tus okumak, ve ekrana bir karakter yazmayi
  73. saglarlar. 
  74.  
  75. "getchar()" isimli fonksiyon, klavyeden okudugu tusu dondurur, bu deger
  76. "c" ye atanir. "putchar()" fonksiyonu ise, bu degeri ekrana yansitir. 
  77.  
  78. Bu programi derleyip calistirdiginizda, bir surpriz ile karsilasacaksiniz.
  79. Klavyeden yazdiginizda, ekrana herseyin iyi bir sekilde yansitildigini
  80. goreceksiniz. RETURN tusuna bastiginizda ise, butun satirin tekrar ekrana
  81. yazildigini goreceksiniz. Her karakteri teker teker ekrana getirmesini
  82. soyledigimiz halde, programimiz sanki butun satiri sakliyor gibi. 
  83.  
  84. DOS BIZE YARDIMCI OLUYOR (YADA ISE KARISIYOR)
  85.  
  86. Bu durumu anlayabilmek icin, DOS un nasil calistigini anlamamiz
  87. gereklidir. Klavyeden tuslar DOS kontrolu ile okundugu zaman, RETURN tusu
  88. basilana dek, basilan tuslar bir sahada saklanir. RETURN basilinca da,
  89. butun satir programa dondurulur. Tuslara basilirken, karakterler ekrana da
  90. yansitilir. Bu duruma da "eko" ismi verilir. 
  91.  
  92. Simdi anlatilanlari goz onunde bulundurarak, programimiz calisirken ekrana
  93. eko edilenlerin, DOS tarafindan yapildigini anlayabilirsiniz. Siz RETURN e
  94. basinca da, bu saklanan tuslar, programa gonderilir. Bunu daha iyi anlamak
  95. icin, icinde buyuk harf X olan bir satir yazin. DOS, buyuk X in ozel bir
  96. tus oldugundan habersiz, siz RETURN e basana kadar tuslari kabul etmeye
  97. devam eder. RETURN e basinca ise, bu katar programa gecirilir, ve program
  98. X e rastlayincaya kadar ekrana karakterleri birer birer yazar.
  99.  
  100. Isletim sisteminin bu tuhafliklari karsisinda yilmayin. Bazi
  101. programlarinizda, bu ozellik isinize yarayabilir. Fakat simdi biz, az once
  102. yazdigimiz programin, dusundugumuz gibi calismasini saglayalim.
  103.  
  104. TEKIO.C:
  105. ================================================================
  106.  
  107. #include <stdio.h>
  108.  
  109. main()
  110. {
  111. char c;
  112.  
  113.    printf("Herhangi bir tusa basin.  X = Programi durdurur. \n");
  114.  
  115.    do {
  116.       c = getch();                     /* bir tus oku          */
  117.       putchar(c);                  /* basilan tusu goster      */
  118.    } while (c != 'X');             /* ta ki c == 'X' olana dek */
  119.  
  120.    printf("\nProgramin sonu.\n");
  121. }
  122. ================================================================
  123.  
  124. Bu programdaki yegane degisiklik olan yeni fonksiyon "getch()", yine
  125. klavyeden tek bir karakter okur. Farki, "getchar" gibi DOS'a
  126. takilmamasidir. Bir karakter okur, ve ekrana yansitmadan bu tusu programa
  127. dondurur. 
  128.  
  129. Bu programi calistirdiginizda, bir oncekindeki gibi tekrarlanan satirlar
  130. olmadigini goreceksiniz. Ayrica program artik 'X' e basar basmaz
  131. durmaktadir. Burada baska bir problemimiz var. RETURN'e basinca cursor,
  132. ekranin soluna gitmektedir, ama bir alt satira inmemektedir. 
  133.  
  134. SATIR ATLAMAMIZ LAZIM
  135.  
  136. Cogu uygulama programi siz RETURN e basinca, program o RETURN e ek olarak
  137. bir de "Line Feed" yani satir atlama karakteri ilave eder. Satir atlama
  138. otomatik olarak yapilmaz. Bundan sonraki programda, bu sorunu da halletmis
  139. olacagiz. 
  140.  
  141. IYIIO.C:
  142. ================================================================
  143. #include "stdio.h"
  144. #define CR 13       /* CR sembolunu 13 olarak tanimlar */
  145. #define LF 10       /* LF sembolunu 10 olarak tanimlar */
  146.  
  147. main()
  148. {
  149. char c;
  150.  
  151.    printf("Tuslara basin. Durmak icin X e basin.\n");
  152.  
  153.    do {
  154.       c = getch();                    /* Bir karakter oku        */
  155.       putchar(c);                     /* basilan tusu ekrana yaz */
  156.       if (c == CR) putchar(LF);       /* sayet basilan RETURN tusu ise,
  157.                                       bir SATIR ATLAMA karakteri yolla */
  158.    } while (c != 'X');
  159.  
  160.    printf("\nProgramin sonu.\n");
  161. }
  162. ================================================================
  163. Programin ilk basinda CR 'nin artik 13 e esit oldugunu ve LF nin de 10
  164. oldugunu belirtiyoruz. Sayet ASCII tablosundan bakarsaniz, RETURN tusuna
  165. karsilik gelen kodun 13 oldugunu gorursunuz. Ayni tabloda, satir atlama
  166. kodu da 10 dur.
  167.  
  168. Ekrana basilan tusu yazdiktan sonra, sayet bu tus RETURN tusu ise, bir
  169. satir atlayabilmemiz icin, satir atlama kodunu ekrana yaziyoruz.
  170.  
  171. Programin basindaki "#define" lar yerine "if (c == 13) putchar(10);"
  172. diyebilirdik, fakat ne yapmak istedigimiz pek belirgin olmazdi. 
  173.  
  174. HANGI METOD DAHA IYI?
  175.  
  176. Burada ekrandan bir harf okumanin iki yolunu inceledik. Her ikisinin de
  177. avantajlari ve dezavantajlari var. Bunlara bir bakalim.
  178.  
  179. Ilk metodda, butun isi DOS ustlenmektedir. Programimiz baska islerle
  180. ugrasirken, DOS bizim icin satiri hazirlayabilir, ve RETURN'e basilinca bu
  181. satiri programa dondurebilir. Fakat, bu metodda karakterleri basildiklari
  182. anda fark etmemiz imkansizdir.
  183.  
  184. Ikinci metodda, tuslari teker teker fark etmemiz mumkundur. Fakat,
  185. program bu okuma sirasinda butun zamanini okumaya harcar ve baska bir is
  186. yapamaz, ve bilgisayarin tum zamanini bu isle almis oluruz. 
  187.  
  188. Hangi metodun uzerinde calistiginiz program icin daha uygun oldugunu
  189. programci olarak siz karar vereceksiniz.
  190.  
  191. Burada, "getch()" fonksiyonun tersi olan "ungetch()" isimli bir fonksiyon
  192. daha oldugunu da belirtmeliyim. Sayet bir karakteri "getch()" le okuduktan
  193. sonra fazla okudugunuzu fark ederseniz, bu fonksiyon ile okunan tusu geri
  194. koyabilirsiniz. Bu bazi programlarin yazilimini kolaylastirmaktadir cunku
  195. bir tusu istemediginizi onu okuyuncaya kadar bilemezsiniz. Sadece bir tek
  196. tusu "ungetch" edebilirsiniz, fakat genellikle bu yeterlidir. 
  197.  
  198. BIRAZ TAMSAYI OKUYALIM
  199.  
  200. TAMOKU.C:
  201. ================================================================
  202. #include <stdio.h>
  203.  
  204. main()
  205. {
  206. int deger;
  207.  
  208.    printf("0 ila 32767 arasinda bir rakam yazin, durmak icin 100 girin.\n");
  209.  
  210.    do {
  211.       scanf("%d",°er);   /* bir tamsayi oku (adresi ile) */
  212.       printf("Okunan deger %d idi. \n",deger);
  213.    } while (deger != 100);
  214.  
  215.    printf("Programin sonu\n");
  216. }
  217. ================================================================
  218.  
  219. Alistigimiz tip bir program olan TAMOKU'da, "scanf" isimli yeni bir
  220. fonksiyon goruyoruz. Cok kullandigimiz "printf" fonksiyonuna cok benzeyen
  221. bu fonksiyonun gorevi, istenilen tip verileri okuyup, degiskenlere atamak.
  222.  
  223. "printf" den en buyuk farki, "scanf" in degisken degerleri yerine,
  224. adreslerini kullanmasidir. Hatirlayacaginiz gibi, bir fonksiyonun
  225. parametrelerinin degerlerini degistirebilmesi icin, degiskenin adresine
  226. ihtiyaci vardir. "scanf" fonksiyonuna adres yerine deger gecirmek, C
  227. dilinde en SIK rastlanan hatalardan biridir. 
  228.  
  229. "scanf" fonksiyonu, girilen satiri, satirdaki bosluklara bakmadan, ve bu
  230. sekilde kullanildiginda, rakam olmayan bir karakter bulana kadar bir
  231. tamsayi okur.
  232.  
  233. Sayet 32766 den buyuk bir rakam girerseniz, programin hata yaptigini
  234. gorursunuz. Ornegin 65536 girerseniz, programin 0 degerini dondurdugunu
  235. gorursunuz. Buna sebep, tamsayilarin hafizada saklanisinda onlara 16
  236. bitlik bir saha ayrilmasindandir. Programinizda daha buyuk rakamlar
  237. kullanacaksaniz, 'long' yada 'float' tiplerini secebilirsiniz.
  238.  
  239. KARAKTER KATARI GIRISI
  240.  
  241. KATARIN.C:
  242. ================================================================
  243. #include <stdio.h>
  244.  
  245. main()
  246. {
  247. char big[25];
  248.  
  249.     printf("Karakter katari girin, en fazla 25 karakter.\n");
  250.     printf("Birinci kolonda X yazarak programi bitirin.\n");
  251.  
  252.     do {
  253.        scanf("%s",big);
  254.        printf("Yazdiginiz katar -> %s\n",big);
  255.     } while (big[0] != 'X');
  256.  
  257.     printf("Programin sonu.\n");
  258. }
  259. ================================================================
  260.  
  261. Bu program bir oncekine cok benzer, fakat bu sefer bir kelime katari
  262. giriyoruz. 25 elemanli bir dizi tanimlanmistir, fakat en son deger bir '0'
  263. olmasi gerektiginden, kullanilabilen kisimi 24 dur. "scanf" deki
  264. degiskenin onune & ampersand isareti gerekmez cunku, koseli parantezleri
  265. olmayan bir dizi degiskeni, C dilinde o dizinin baslangicini gosteren
  266. bir adrestir. 
  267.  
  268. Calistiginizda, sizi bir supriz bekliyor. Yazdiginiz cumleyi, program ayri
  269. satirlarda gosterir. Bunun sebebi, "scanf" bir katar okurken, satirin
  270. sonuna yada bir bosluga rastlayincaya kadar okumasina devam eder. Bir
  271. dongu icinde oldugumuzdan, program tekrar tekrar "scanf" i cagirarak,
  272. DOS'un giris sahasinda kalan butun karakterleri okur. Cumleleri kelimelere
  273. boldugunden, X ile baslayan herhangi bir kelimeye rastlayinca, bu program
  274. durur.
  275.  
  276. 24 karakterden daha fazlasini girmeye calisin. Ne olduguna bakin. Size bir
  277. hata mesaji verebilir, yada programiniz aleti kilitleyebilir. Gercek bir
  278. programda, boyle seylerin sorumlulugu sizlerin omuzlarinizdadir. C dilinde
  279. yazdiginiza size cok sey duser, fakat ayni zamanda bircok kolaylik da
  280. saglar. 
  281.  
  282. C DE INPUT/OUTPUT PROGRAMLAMA
  283.  
  284. C dili cok miktarda input/output yapan programlar icin degil de, bir
  285. bircok icsel islemler yapan sistem programlari icin yazilmistir.
  286. Klavye'den bilgi alma rutinleri cok kullanislidir, fakat C size az 
  287. yardimci olur. Yani, yapmaniz gereken I/O islemlerinde sorun cikmasini
  288. onlemek icin detaylarla sizin ugrasmaniz lazimdir. Fakat genellikle
  289. herhangi bir program icin bu tip fonksiyonlari bir defa tanimlamaniz
  290. yeterlidir. 
  291.  
  292. HAFIZADA.C:
  293. ================================================================
  294. main()
  295. {
  296. int rakam[5], sonuc[5], index;
  297. char satir[80];
  298.  
  299.    rakam[0] = 5;
  300.    rakam[1] = 10;
  301.    rakam[2] = 15;
  302.    rakam[3] = 20;
  303.    rakam[4] = 25;
  304.  
  305.    sprintf(satir,"%d %d      %d %d %d\n",rakam[0],rakam[1],
  306.            rakam[2],rakam[3],rakam[4]);
  307.  
  308.    printf("%s",satir);
  309.  
  310.    sscanf(satir,"%d %d %d %d      %d",&sonuc[4],&sonuc[3],
  311.        (sonuc+2),(sonuc+1),sonuc);
  312.  
  313.  
  314.    for (index = 0;index < 5;index++)
  315.       printf("Sonuc %d dir. \n",sonuc[index]);
  316.  
  317. }
  318. ================================================================
  319.  
  320. Bu programda, birkac tane degisken tanimliyoruz, ve "rakamlar" isimli
  321. diziye de, "sprintf" fonksiyonunu incelemek icin rastgele sayilar
  322. atiyoruz. Bu fonksiyon, "printf" e cok benzer. Yegane farki, ciktisini
  323. ekrana yazmak yerine, bir karakter dizisine yazmasidir. Bunu da, ilk
  324. parametresi olarak veriyoruz. Yani program bu fonksiyondan dondukten
  325. sonra, "satir" dizisinin icinde, bes tane rakam olacaktir. Ikinci ile
  326. ucuncu rakamlar arasindaki bosluk, "sscanf" fonksiyonunun bunlarin
  327. uzerinden atlamasini gormek icindir. 
  328.  
  329. Bunun altinda "printf" i kullanarak bu hazirladigimiz satiri yaziyoruz.
  330. Daha sonra gordugunuz, "sscanf" fonksiyonu ise, "scanf" gibi ekrandan
  331. okumak yerine, bizim "satir" dizimizden degerleri okur. Gordugunuz gibi,
  332. "sscanf" e rakamlarin konacagi dizinin adreslerini cok degisik sekillerde
  333. verebiliyoruz. Ilk ikisi, sadece dizideki 5. ve 4. elemanlarin adreslerini
  334. index vererek tanimliyorlar, sonraki ikisi ise, dizinin baslangic adresine
  335. bir offset (bir rakam) ekleyerek buluyorlar. Sonuncusu ise, koseli
  336. parantezi olmayan bir dizinin, o dizinin baslangic elemaninin adresini
  337. gostereceginden, hicbir sey gerektirmiyor. 
  338.  
  339. Bazen, bir programin ciktilarini, standart ciktidan (ekrandan), bir baska
  340. kutuge yoneltmek istenir. Fakat, hata mesajlarini gibi bazi mesajlari hala
  341. ekrana yollamak isteyebilirsiniz:
  342.  
  343. OZEL.C:
  344. ================================================================
  345. #include <stdio.h>
  346.  
  347. main()
  348. {
  349. int index;
  350.  
  351.    for (index = 0;index < 6;index++) {
  352.       printf("Bu satir, standart ciktiya gidiyor.\n");
  353.       fprintf(stderr,"Bu satir ise standart hataya gidiyor.\n");
  354.    }
  355.  
  356.    exit(4);  /* Bu komut, DOS 'un ERRORLEVEL komutu ile bir batch file'da
  357.         (yigit kutugunde) kontrol edilebilir. Bu programin
  358.         döndúrdúgú deger, soyle kontrol edilebilir:
  359.  
  360.         A> COPY CON: DENE.BAT   <RETURN>
  361.  
  362.         OZEL
  363.         IF ERRORLEVEL 4 GOTO DORT
  364.         (Dortten kucukse, buraya devam eder..)
  365.                 .
  366.                 .
  367.         GOTO BITTI
  368.         :DORT
  369.         (dort yada buyukse, buraya devam eder)
  370.                 .
  371.                 .
  372.         :BITTI
  373.  
  374.         <F6> <RETURN>
  375.  
  376.                                   */
  377. }
  378. ================================================================
  379.  
  380. Bu program, bir dongu, ve icinde iki satirdan olusur. Bu satirlardan bir
  381. tanesi standart ciktiya, bir tanesi de standart hataya gider. Burada
  382. gordugunuz "fprintf" komutu, "printf" e cok benzer, fakat ciktinin nereye
  383. gidecegini de belirtmenizi saglar. Bu alanda bir sonraki konuda daha uzun
  384. duracagiz. 
  385.  
  386. Program calisinca, ekranda on iki tane satir goreceksiniz. Sayet bu
  387. programi:
  388.  
  389. A>  OZEL > CIKTI
  390.  
  391. seklinde calistirirsaniz, ekranda sadece alti tane standart hataya giden
  392. mesajlari goreceksiniz. Geri kalan (standart ciktiya giden) alti tanesi
  393. ise, "cikti" isimli kutukte yer alacaktir.
  394.  
  395. YA exit(4) KOMUTU ?
  396.  
  397. Bu programdaki en son satir olan "exit(4)" komutu, programi sona erdirir,
  398. ve dort degerini DOS a dondurur. Parantezlerin arasinda 0 ila 9 degerleri
  399. kullanilabilir. Sayet bir "batch" (yigit) kutugu icinde bu programi
  400. calistiriyorsaniz, bu degeri ERRORLEVEL komutu ile kontrol edebilirsiniz.
  401.  
  402. ODEV
  403.  
  404. 1. Bir dongu icinde bir harf okuyun ve ekrana bu harfi normal "char"
  405. tipinde gosterin. Bu harfi bir rakam olarak da gosterin. Programi
  406. durdurmak icin, dolar sembolunu bekleyin. "getch" fonksiyonunu kullanarak
  407. programin tusa basilir basilmaz islemesini saglayin. F tuslari gibi ozel
  408. tuslara basarak ne oldugunu kaydedin. Her fonksiyon tusundan iki tane
  409. deger donecektir. Birincisi sifir olup, ozel bir tusa basildigini haber
  410. verecektir. 
  411.  
  412.